package com.knightboy.smartshoes.coreUtil;

import com.knightboy.smartshoes.myUi.BlueToothLeService;

/**
 * Created by knightBoy on 2015/7/19.
 * 未解决问题：根据足压计算体重
 * 此类被DataHelper调用，用于数据更新。界面可以从此类中获得必要的数据
 */
public  class SharedData {
    /**
     * 两个标志位都是由程序外部判断，并且执行操作后改变标志值
     */
    //表征是否是第一次开启应用，即部分数据是否通过服务器加载
    //为真时获得足压建议，以及以前的平均体重,然后外部改变值
    static boolean isStart = true;

    //表征是否第一次记录步数
    static boolean isFirstStep = true;

    //卡路里部分
    static double activeCalorie;          //活动消耗的卡路里
    static double restCalorie;            //休息消耗的卡路里

    //时间部分
    static long activeTime;             //活动时间(ms)
    static long restTime;               //休息时间（ms）
    static long lastStepTime = System.currentTimeMillis();//上一次走步时间(ms),开始值大致为进入系统的时间
    static long longestActiveTime;      //最长活动时间（ms）
    static long longestRestTime;        //最长休息时间（ms）

    //时间辅助类
    static long firstStepTime;         //前一步的时间戳（毫秒）
    static long secondStepTime;        //后一步的时间戳（毫秒）
    static double firstStepSpeed;      //前一步的速度（m/s）
    static double secondStepSpeed;     //后一步的速度(m/s)

    //其他数据
    static int step;                   //步数
    static double distance;            //路程
    static int rate = 100;             //体重占上周比率，初始是为100%
    static double lastWeight;          //上周平均体重
    static double weight;              //体重
    static String suggestion;          //足压建议
    static double stress1;             //足压1
    static double stress2;             //足压2

    public static void reset(){
        isStart = true;
        isStart = true;
        activeCalorie = restCalorie = 0;
        activeTime = restTime = longestActiveTime = longestRestTime = 0;
        firstStepTime = secondStepTime = 0;
        firstStepSpeed = secondStepSpeed = 0;
        step = 0;
        distance = 0;
        rate = 0;
        weight = stress1 = stress2 = 0;
    }

    /**
     * 取得属性值。下同
     * @return
     */
    public static boolean getIsStart(){
        return isStart;
    }

    public static boolean getIsFirstStep(){
        return isFirstStep;
    }

    public static int getStep(){
        return step;
    }

    public static double getDistance(){
        return distance;
    }

    public static int getActiveCalorie(){
        return (int)activeCalorie;
    }

    public static int getRestCalorie(){
        return (int)restCalorie;
    }

    public static double getStress1(){
        return stress1;
    }

    public static double getStress2(){
        return stress2;
    }

    //涉及到时间由毫秒单位到分钟单位转换
    public static int getActiveTime(){
        return (int)(activeTime/60000);
    }

    public static int getRate(){
        return rate;
    }

    /**
     * 走了一步之后，应该用新值
     * @return
     */
    public static double getWeight(){
        if(isFirstStep){
            return lastWeight;
        }else {
            return weight;
        }
    }

    public static int getLongestActiveTime(){
        return (int)(longestActiveTime/60000);
    }

    public static int getLongestRestTime(){
        return (int)(longestRestTime/60000);
    }

    /**
     * 在走一步时改变“上一次走步时间”
     */
    public static void setLastStepTime(){
        lastStepTime = System.currentTimeMillis();
    }

    /**
     * 改变初始标志
     */
    public static void setIsStart(){
        isStart = false;
    }

    public static void setIsFirstStep(){
        isFirstStep = false;
    }

    /**
     * 设置路程
     */
    public static void addDistance(double aDistance){
        distance += aDistance;
    }

    /**
     * 足压数据更新
     * 足压数据不需要实时更新，故将其独立。其他的类似
     */
    public static void setStress(double stressOne, double stressTwo){
        stress1 = stressOne;
        stress2 = stressTwo;
    }

    /**
     * 设置足压反馈建议
     * @param aSuggestion
     */
    public static void setSuggestion(String aSuggestion){
        suggestion = aSuggestion;
    }

    /**
     * 设置体重
     * @param aWeight
     */
    public static void setWeight(double aWeight){
        weight = aWeight;
    }

    /**
     * 设置体重与上周的比率
     * @param aRate
     */
    public static void setRate(int aRate){
        rate = aRate;
    }

    /**
     * 设置上周体重
     * @param aWeight
     */
    public static void setLastWeight(double aWeight){
        lastWeight = aWeight;
    }

    /**
     * 判断是否需要休息一下了
     * @param aTime 现在的时间，与上一次走步时间进行比较
     * @return
     */
    public static boolean hasABreak(long aTime){
        if((aTime - lastStepTime) > 1000*60*1){
            return true;
        }else {
            return false;
        }
    }

    /**
     * 如果是第一步，要记录现在体重，足压，重新设置比率.不是的话则不需要
     * @param speed
     * @param aDistance
     */
    public static void firstUpdateData(double speed, double aDistance){
        //更新其他数据项
        firstStepTime = System.currentTimeMillis();
        firstStepSpeed = speed;
        step++;
        addDistance(aDistance);
        setLastStepTime();
    }

    /**
     * 更新数据的主要方法,从第二部步开始调用，当走了一步之后便调用更新数据
     * @param speed
     */
    public static void updateData(double speed, double aDistance){
        //参数传递进来
        secondStepSpeed = speed;
        secondStepTime = System.currentTimeMillis();
        addDistance(aDistance);

        //根据参数执行相应计算
        long interval = secondStepTime - firstStepTime;
        //如果前一步与后一步的时间间隔超过3秒，认为是在休息
        //在休息
        if(interval > 3000){
            //休息卡路里，休息总时间，休息最长时间
            restCalorie += (weight/1800.0) * (interval/2000.0);
            restTime += interval;
            if(interval > longestRestTime){
                longestRestTime = interval;
            }
        }
        //在活动
        else{
            //活动卡路里，活动总时间，活动最长时间
            activeCalorie += 4.5 * (weight/1800.0) * ((firstStepSpeed + secondStepSpeed)/2) * (interval/2000.0);
            activeTime += interval;
            if(interval > longestActiveTime){
                longestActiveTime = interval;
            }
        }

        //后续处理
        step++;
        firstStepTime = secondStepTime;
        firstStepSpeed = secondStepSpeed;
        setLastStepTime();
    }
}